home *** CD-ROM | disk | FTP | other *** search
- // usb_diag.cpp - diagnostic sample for testing usb devices
- //
-
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include "../../include/windrvr.h"
- #include "../shared/usb_diag_lib.h"
-
- class UsbDiagSession
- {
- private:
- char line[256];
- WD_USB_DEVICE_REGISTER *m_pDev;
- int GetPipeType(DWORD dwPipe);
- public:
- HANDLE m_hWD;
- UsbDiagSession();
- int MainMenu();
- virtual ~UsbDiagSession();
- void DoReadWrite();
- void DoResetPipe();
- void DoCloseDevice();
- void DoOpenDevice();
- void DoDisplayPipesInfo();
- void DoResetDevice();
- BOOL Init();
- void CloseWindriver();
- };
-
- int UsbDiagSession::GetPipeType(DWORD dwPipe)
- {
- if(!m_pDev || !m_pDev->hDevice)
- return -1;
-
- for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
- {
- WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
- if (pPipe->dwNumber==dwPipe && pPipe->type>=0 && pPipe->type<3)
- return pPipe->type;
- }
- return -1;
- }
-
- UsbDiagSession::UsbDiagSession()
- {
- m_hWD = INVALID_HANDLE_VALUE;
- m_pDev = NULL;
- }
-
- UsbDiagSession::~UsbDiagSession()
- {
- DoCloseDevice();
- CloseWindriver();
- };
-
- void UsbDiagSession::DoResetDevice()
- {
- if(!m_pDev || !m_pDev->hDevice)
- return;
- WD_UsbResetDevice(m_hWD, m_pDev->hDevice);
- }
-
- void UsbDiagSession::DoCloseDevice()
- {
- if(!m_pDev || !m_pDev->hDevice)
- return;
- WD_UsbDeviceUnregister(m_hWD, m_pDev);
- free (m_pDev);
- m_pDev = NULL;
- printf("Device closed successfully\n");
- }
-
- void UsbDiagSession::CloseWindriver()
- {
- if(m_hWD == INVALID_HANDLE_VALUE)
- return;
- WD_Close(m_hWD);
- m_hWD = INVALID_HANDLE_VALUE;
- }
-
- BOOL UsbDiagSession::Init()
- {
- m_hWD = WD_Open();
- return (m_hWD != INVALID_HANDLE_VALUE);
- }
-
- void UsbDiagSession::DoOpenDevice()
- {
- if(m_pDev && m_pDev->hDevice)
- {
- printf("Device already open ! \n");
- return;
- }
-
- if (!m_pDev)
- m_pDev = (WD_USB_DEVICE_REGISTER *) malloc(sizeof(WD_USB_DEVICE_REGISTER));
-
- BZERO(*m_pDev);
-
- printf ("Please enter physical address, configuration and interface data:\n");
- printf ("------------------------------------\n");
- printf ("Enter unique ID of the device: ");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&m_pDev->uniqueId);
- printf ("Enter configuration index: ");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&m_pDev->dwConfigurationIndex);
- printf ("Enter interface number: ");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&m_pDev->dwInterfaceNum);
- printf ("Enter alternate setting of the interface : ");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&m_pDev->dwInterfaceAlternate);
-
-
- WD_UsbDeviceRegister(m_hWD, m_pDev);
- if (!m_pDev->hDevice)
- {
- printf("Failed registring the device\n");
- free (m_pDev);
- m_pDev = NULL;
- return;
- }
- DoDisplayPipesInfo();
- }
-
- void UsbDiagSession::DoDisplayPipesInfo()
- {
- printf("device has %d pipes:\n", m_pDev->Device.dwPipes);
- for (DWORD i=0; i<m_pDev->Device.dwPipes; i++)
- {
- WD_USB_PIPE_INFO *pPipe = &m_pDev->Device.Pipe[i];
- PCHAR pipeType[] ={"Control", "Isochronous", "Bulk", "Interrupt"};
- if (pPipe->type>3)
- printf("recived wrong pipe type (0x%x)\n", pPipe->type);
- printf("pipe no. %02x - type: %s\n", pPipe->dwNumber, pipeType[pPipe->type]);
- printf(" max packet size: %d, direction: %s, interval: %d\n",
- pPipe->dwMaximumPacketSize,
- pPipe->direction==USB_DIR_IN ? "In" : pPipe->direction==USB_DIR_OUT ? "Out" : "In & Out",
- pPipe->dwInterval);
- }
- }
-
- void UsbDiagSession::DoReadWrite()
- {
- WD_USB_TRANSFER transfer;
- BZERO(transfer);
- BOOL fStatus = 0;
-
- if(!m_pDev || !m_pDev->hDevice)
- return;
-
- transfer.hDevice = m_pDev->hDevice;
- printf("Enter pipe number:");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%x",&transfer.dwPipe);
- printf("Enter direction of data (0-OUT , 1-IN): ");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&transfer.fRead);
- if (GetPipeType(transfer.dwPipe)==0) // control pipe
- {
- printf("Enter setup packet (8 bytes)\n");
- GetHexBuffer((PVOID)transfer.SetupPacket, 8);
- transfer.dwBytes = transfer.SetupPacket[6] + (transfer.SetupPacket[7]<<8);
- }
- else
- {
- printf("Enter buffer size to %s:" , transfer.fRead ? "read" : "write");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d", &transfer.dwBytes);
- }
-
- transfer.pBuffer = malloc (transfer.dwBytes);
- if(!transfer.pBuffer)
- {
- printf("Failed to allocate buffer\n");
- return;
- }
-
- printf("Enter wait time in kernel in milli-seconds (0 for infinite):");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d", &transfer.dwTimeout);
- if(!transfer.fRead)
- {
- printf("Enter data :");
- GetHexBuffer(transfer.pBuffer, transfer.dwBytes);
- }
-
- WD_UsbTransfer(m_hWD, &transfer);
- if (transfer.fOK)
- printf("transfer successful\n");
- else
- printf("error on transfer\n");
- if(transfer.fRead && transfer.dwBytesTransfered)
- PrintHexBuffer(transfer.pBuffer, transfer.dwBytesTransfered);
- printf("Bytes transferred = %d\n", transfer.dwBytesTransfered);
- free(transfer.pBuffer);
- return;
- }
-
- void UsbDiagSession::DoResetPipe()
- {
- WD_USB_RESET_PIPE resetPipe;
- BZERO(resetPipe);
- if(!m_pDev || !m_pDev->hDevice)
- return;
- resetPipe.hDevice = m_pDev->hDevice;
- printf("Enter pipe number:");
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&resetPipe.dwPipe);
- WD_UsbResetPipe(m_hWD, &resetPipe);
- }
-
- int UsbDiagSession::MainMenu()
- {
- int cmd = 0;
- char line[100];
- printf("\n");
- printf("--------- " WD_PROD_NAME " USB Diagnostic ------------ \n");
- printf("--------- Main Menu ---------\n");
- printf("(1) - Scan for USB Devices\n");
- printf("(2) - Get device configurations\n");
- if (!m_pDev || !m_pDev->hDevice)
- printf("(3) - Open device \n");
- else
- {
- printf("(4) - Display pipes info\n");
- printf("(5) - Reset USB Device and Port\n");
- printf("(6) - Reset Pipe \n");
- printf("(7) - Read\\write from pipe\n");
- printf("(8) - Close USB Device\n");
- }
- printf("(99) - Exit\n");
-
- fgets(line, sizeof(line), stdin);
- sscanf(line, "%d",&cmd);
-
- return cmd;
- }
-
- int _cdecl main(int argc, char *argv[])
- {
- UsbDiagSession session;
-
- if(!session.Init())
- return 0;
-
- while (1)
- {
- switch (session.MainMenu())
- {
- case 1:
- USB_Print_all_devices_info();
- break;
- case 2:
- USB_Print_device_Configurations();
- break;
- case 3:
- session.DoOpenDevice();
- break;
- case 4:
- session.DoDisplayPipesInfo();
- break;
- case 5:
- session.DoResetDevice();
- break;
- case 6:
- session.DoResetPipe();
- break;
- case 7:
- session.DoReadWrite();
- break;
- case 8:
- session.DoCloseDevice();
- break;
- case 99:
- return 0;
- }
- }
- return 0;
- }
-